<template>
  <div id="app-container">
    <!-- Header的头部 -->
    <Header></Header>
    <!-- 循环渲染每一个商品信息 -->
    <Goods
      v-for="item in list"
      :key="item.id"
      :id="item.id"
      :title="item.goods_name"
      :price="item.goods_price"
      :pic="item.goods_img"
      :count="item.goods_count"
      :state="item.goods_state"
      @state-change="getNewState"
    >
      <Counter
        :num="item.goods_count"
        @num-change="getNum(item, $event)"
      ></Counter>
    </Goods>
    <Footer
      :isFull="fullState"
      :amount="amt"
      @new-full="getFullState"
      :all="total"
    ></Footer>
    <!-- <p>{{fullState}}</p> -->
    <!-- <h1>App组件</h1> -->
  </div>
</template>

<script>
// 拿数据
// 1.在终端安装axios npm i axios -S在该组件中导入axios
import axios from 'axios'
// 导入需要的组件
import Header from '@/components/Header/Header.vue'
//
import Goods from '@/components/Goods/Goods.vue'
import Footer from '@/components/Footer/Footer.vue'
import bus from '@/components/eventBus.js'
import Counter from '@/components/Counter/Counter.vue'
export default {
  // 3.在created生命函数中，调用步骤2封装的initCartList函数
  created() {
    // 调用请求数据的方法
    this.initCartList()
    bus.$on('share', (val) => {
      this.list.some((item) => {
        if (item.id === val.id) {
          item.goods_count = val.value
          return true
        }
      })
    })
  },
  data() {
    return {
      // 用来存储购物车的列表数据，默认为空
      list: []
    }
  },

  // 2.在methods方法中，定义initCartList函数列表数据
  methods: {
    getNum(item, e) {
      // console.log(e);
      // 这里的e表示counter.vue中add()的 this.num+1
      item.goods_count = e
    },
    // 接收子组件传递过来的数据
    // e的格式为{id,value}
    getNewState(e) {
      console.log('接收到数据')
      console.log(e)
      this.list.some((item) => {
        if (item.id === e.id) {
          item.goods_state = e.value
          // 终止后续循环
          return true
        }
      })
    },
    //  接收footer子组件传递过来的数据
    getFullState(e) {
      //  console.log();
      console.log(e)
      this.list.forEach((item) => (item.goods_state = e))
    },
    // 封装请求列表数据的方法
    async initCartList() {
      // 调用axios 的get方法，请求列表数据
      // 如果调用某个方法的返回值是 Promise 实例，则前面可以添加 await！
      // await 只能用在被 async “修饰”的方法中
      const { data: res } = await axios.get('https://www.escook.cn/api/cart')
      // 只要请求回来的数据，在页面渲染期间会用到，则必须转存到data中
      if (res.status === 200) {
        this.list = res.list
      }
      console.log(res)
    }
  },

  components: {
    Header,
    Goods,
    Footer,
    Counter
  },
  // 计算属性
  computed: {
    // 动态计算出全选的状态是false还是true
    fullState() {
      return this.list.every((item) => item.goods_state)
    },
    // 已勾选商品的总价格
    // 父传子
    amt() {
      // 1.先filter过滤
      // 2.再reduce累加
      return this.list
        .filter((item) => item.goods_state)
        .reduce(
          (total, item) => (total += item.goods_price * item.goods_count),
          0
        )
    },
    total() {
      return this.list
        .filter((item) => item.goods_state)
        .reduce((t, item) => (t += item.goods_count), 0)
    }
  }
}
</script>

<style lang="less" scoped>
#app-container {
  padding-top: 45px;
  padding-bottom: 50px;
}
</style>
